package ArraysList;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA
 * Description:
 * User:34398
 * Date:2024-03-27
 * Time:16:36
 */

class MyList implements IList {
    int[] arr;
    int UseSize;//指向最后一个数据的下一个位置的下标

    public MyList() {
        this.arr = new int[10];
        //当前的大小默认初始化为0，所以不用管
    }

    //判断当前数据有没有满
    private boolean isFull() {//只在当前类中，判断数组是否满了，所以用private锁死
        if (this.UseSize == this.arr.length) {//已经满了
            return true;
        }
        return false;
    }


    @Override
    public void add(int data) {//默认尾插
        //判断是否需要扩容
        if (this.isFull()) {//满了
            this.arr = Arrays.copyOf(arr, arr.length * 2);
        }

        //然后在尾插，更新当前的下标
        this.arr[this.UseSize] = data;

        this.UseSize++;
    }

    @Override//对于指定位置插入，不能大于当前的UseSize
    public void add(int pos, int data) {//在某个位置，插入数据
        //当前的容量现存这
        int index = this.UseSize;

        this.UseSize++;

        //判断该位置是否合法
        if (pos > index || pos < 0) {
            this.UseSize--;
            throw new ArrayIndexOutOfBoundsException("数组越界！");
        }

        //判断容量是否满了
        if(this.isFull()){
            this.arr=Arrays.copyOf(arr,arr.length*2);
        }

            //插入
        //如果是尾插，直接调用，add
        if (pos == this.arr.length) {
            this.add(data);
        }else{
            //不是尾插
            //先把位置挪出来
            for (int i = index; i > pos; i--) {
                arr[i] = arr[i - 1];
            }

            //放数据
            arr[pos] = data;
        }


        return;
    }


    @Override
    public boolean isContains(int data) {//判断是否存在某一个元素
        for (int i = 0; i < this.UseSize; i++) {
            if (arr[i] == data) return true;
        }
        return false;
    }


    @Override
    public int indexOf(int data) {//某一个元素对应的下标
        //遍历，看是否找到，找到返回下标，没找到返回-1

        for (int i = 0; i < this.arr.length; i++) {
            if (arr[i] == data) return i;
        }


        return -1;
    }

    @Override
    public int get(int index) {//返回对应下标的值，越界，抛出异常
        if (index < 0 || index >= this.UseSize) {
            throw new ArrayIndexOutOfBoundsException("数组越界了");
        }

        return this.arr[index];
    }


    @Override
    public void remove(int data) {//删除这个元素，没找就到提示
        for (int i = 0; i < this.arr.length; i++) {
            if (data == arr[i]) {
                int k = i;

                //即使只有一个元素也没有关系
                for (int j = k; j < this.UseSize - 1; j++) {
                    arr[j] = arr[j + 1];
                }
                this.UseSize--;
                return;
            }
        }
        //没找到
        System.out.println("顺序表中没有此元素！");
    }

    @Override
    public int listSize() {//返回当前顺序表的长度
        return this.UseSize;
    }

    @Override
    public void clear() {//清空顺序表
        this.UseSize = 0;
    }

    @Override
    public void show() {
        if(this.UseSize==0) {
            System.out.println("当前顺序表为空");
            return;
        }
        System.out.println("**************************************************");
        for (int i = 0; i < this.UseSize ; i++) {
            System.out.print(arr[i]);
        }
        System.out.println();
        System.out.println("**************************************************");
    }
}
